#ifndef Header_Guard_GUID__D9D3C54A_F02E_4D49_ADAB_E43683217DD8
#define Header_Guard_GUID__D9D3C54A_F02E_4D49_ADAB_E43683217DD8

/// @file jjwf/xutility/code_convert.hpp
///
/// @brief 提供(gbk,utf-8)(utf8-utf16)(gbk, utf16)之间的编码转换
///     - 不依赖第三方库
///     - 这里没有使用boost库，避免boost库在不同平台下的依赖
///
/// @attention 本文件所提供的转换不适合单次数据量比较大的转换

#include <string>

namespace jjwf {
    namespace codecvt {
        
        /// 提供常用 ansi(gbk), utf8, utf16的转换
        ///        所有返回值均使用move
        
        /**
         * @name 基于ansi的多字节编码与utf8之间的转换
         *
         * @attention 在不同系统下，locale描述不同，
         *    比如windows下是"chs"，linux下是"zh_CN.gb18030", macos下是"zh_CN"
         *            windows参见msdn, linux/macos使用 locale -a 命令查看
         *
         * @{
         */
        std::string ansi_to_utf8(const std::string& ansi, const char* lc);
        std::string utf8_to_ansi(const std::string& utf8, const char* lc);
        /** @} */
        
        
        /**
         * @brief 基于ansi的中文多字节编码与多字节utf8之间的转换
         */
        std::string gbk_to_utf8(const std::string& gbk);
        std::string utf8_to_gbk(const std::string& utf8);
        /** @} */
        
        /**
         * @brief 多字节utf-8与宽字节utf-16之间的转换
         */
        std::wstring utf8_to_utf16(const std::string& utf8);
        std::string utf16_to_utf8(const std::wstring& utf16);
        /** @} */
        
        /**
         * @brief 基于ansi的多字节编码与宽字节utf-16之间的转换
         */
        std::wstring ansi_to_utf16(const std::string& ansi, const char* lc);
        std::string  utf16_to_ansi(const std::wstring& utf16, const char* lc);
        
        /**
         * @brief 基于ansi的"中文"多字节编码与宽字节utf-16之间的转换
         */
        std::wstring gbk_to_utf16(const std::string& gbk);
        std::string  utf16_to_gbk(const std::wstring& utf16);
        
        /** @} */
        
        
    } // end of namespace codecvt
} // end of namespace jjwf

#endif // Header_Guard_GUID__D9D3C54A_F02E_4D49_ADAB_E43683217DD8

